#ifndef __LIBCARD_H_
#define __LIBCARD_H_

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <termio.h>
#include <sys/signal.h>
#include <pthread.h>
#include <time.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/select.h>
#include <semaphore.h>
#include <sys/socket.h>
#include <dirent.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <sys/wait.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <net/if.h>
#include <stdbool.h>
#include <assert.h>

#ifdef __cplusplus
extern "C"{
#endif

//#define NW_CARD
#define GW_CARD


typedef unsigned char		uint8;
typedef unsigned short		uint16;
typedef unsigned int		uint32;

static int speed_arr[] = 
{
	921600, 460800, 230400, 115200, 
	57600,  38400,  19200,  9600, 
	4800,   2400,   1800,   1200,
	600,    300,    150,    110, 
	75,     50
};

static int baudflag_arr[] = 
{
	B921600, B460800, B230400, B115200, 
	B57600,  B38400,  B19200,  B9600, 
	B4800,   B2400,   B1800,   B1200,
	B600,    B300,    B150,    B110, 
	B75,     B50
};

typedef struct 
{
	char name[512];
	uint32 baud;
	uint8 data_bits;
	uint8 parity;
	uint8 stop_bits;
	uint16 recv_delay;
	uint8 dev_addr;
	uint8 VoltageLevel;
}card_uart_para;


typedef struct
{
	card_uart_para  com;   //串口参数
	char cardtype;     //卡类型
	char auto_find;     //自动寻卡 0 手动寻卡 1 自动寻卡
	char max_lockcount;  //最大灰锁次数
    unsigned char pass[3];

	//以上信息由外部填写，供动态库调用
	//以下信息由本库填写，供外部调用
	char errcode; //错误代码 0 通信正常，1 通信异常
	//以下信息在自动寻卡方式下才填写
	unsigned char  UIDLen;  //卡序列号长度
	char         cardUID[64]; //卡序列号
	char         cmd1[8]; //卡返回命令1
	char         cmd2[8]; //卡返回命令2
	char         cmd3[4]; //卡返回命令3
	short        cardNUM[8]; //卡号
	unsigned int  available_money;//卡余额
	char 		ver;//密匙版本号 
	char 		tag;//算法标识
	int 			rand;//随机数
	int 			mac;//mac地址
}rf_card;

//初始化函数，pcard指向一个rf_card结构， plock指向pthread_mutex_t互斥量,         指向sem_t信号量,在检测到刷卡时置位。
int protocol_card_init(void * pcard, void *plock, void *psem); //返回0成功，1 失败---------------

//关闭函数，释放资源
int protocol_card_close();//返回0成功，1 失败--------------

//激活卡函数，delaytime 等待时间，cardtype 返回的卡类型，UIDLen返回的卡号长度，cardUID指向一个32字节大小的内存，用于存储返回的卡号。
int protocol_enabled_card(short delaytime, char *cardtype, unsigned char *UIDLen, char * cardUID); //返回0成功，1 失败

//读卡数据函数，money 返回卡余额，locknum 返回灰锁次数。
int protocol_read_card(float *money, char *locknum); //返回0成功，1 失败------------------

//写卡数据函数，money 卡余额，locknum 灰锁次数。
int protocol_write_card(float money, char locknum); //返回0成功，1 失败

//退出寻卡状态
int protocol_exit_seek_card_status(void); ////-------------------

#ifdef __cplusplus
}
#endif

#endif
